Spring MVC 애플리케이션 서버에서 HTTP 요청이 처리되는 과정

클라이언트가 HTTP 요청을 Spring MVC 웹 애플리케이션으로 전송하면, 서버 내부에서는 복잡한 워크플로우가 가동됩니다. 이 과정은 네트워크의 요청을 애플리케이션 로직으로 변환하여, 최종적으로 응답을 반환하기까지의 모든 단계를 포함합니다.

1. 요청 진입: 네트워크 & 서블릿 컨테이너

2. 필터 체인

3. 프론트 컨트롤러: DispatcherServlet

4. 컨텍스트 준비

5. 파일 업로드 처리(Multipart)

6. 핸들러 매핑(Controller 찾기)

7. 인터셉터(HandlerInterceptor)

8. 핸들러 어댑터(컨트롤러 메서드 실행)

9. 컨트롤러 메서드 실행

10. 예외 처리

11. 뷰 리졸브

12. 뷰 렌더링

13. 인터셉터 후처리

14. 응답 필터링

15. 응답 반환

요약 표: Spring MVC 내부 요청 라이프사이클

단계 담당 컴포넌트 주요 역할
1. 요청 진입 서블릿 컨테이너 HTTP 요청 수신
2. 필터 처리 Filter 보안, 로깅 등 사전 처리
3. 프론트컨트롤러 DispatcherServlet 라우팅/중앙제어
4. 핸들러 매핑 HandlerMapping 컨트롤러 결정
5. 사전 인터셉터 HandlerInterceptor 컨트롤러 진입 전 커스텀로직
6. 컨트롤러 실행 HandlerAdapter+Controller 비즈니스 로직, 모델 준비
7. 예외 처리 HandlerExceptionResolver 에러 처리
8. 뷰 리졸브 ViewResolver 논리적 뷰 → 실제 뷰 매핑
9. 뷰 렌더링 View(JSP, Thymeleaf 등) HTML/JSON 등 실제 결과 생성
10. 후처리 인터셉터 HandlerInterceptor 응답 직후 로깅/정리
11. 응답 필터링 Filter 응답 압축/로깅 등
12. 응답 송출 서블릿 컨테이너 최종 응답 반환

추가: 고급 기능

결론
Spring MVC는 네트워크, 보안, 비즈니스, 뷰 렌더링을 분리한 계층적 확장 구조로, 모든 단계별로 커스텀 및 확장이 가능하며, 재사용성과 유지보수성, 테스트 용이성이 뛰어납니다.

서블릿이란?

**서블릿(servlet)**은 웹 서버에서 실행되며 웹 클라이언트(대개 웹 브라우저)로부터의 요청을 처리하는 특별한 자바 프로그램입니다. Java 기반 웹 애플리케이션(예: JSP 웹사이트)에서 동적 컨텐츠 생성(폼 처리, DB 접근, 연산 데이터 반환 등)을 담당하는 주체입니다.

핵심 개념

동작 방식

  1. 배포

    • 개발자가 서블릿 클래스를 작성(HttpServlet 상속), 패키징 후 서블릿 컨테이너에 배포합니다.
  2. 요청/응답 흐름

    • 클라이언트(브라우저)가 HTTP 요청을 서버로 보냅니다(예: 폼 제출, 링크 클릭).
    • 서버의 서블릿 컨테이너가 요청 URL에 맞는 서블릿을 찾습니다.
    • 서블릿 컨테이너가 서블릿의 라이프사이클(생성, 초기화, 호출 등)을 관리합니다.
    • 서블릿은 요청객체(HttpServletRequest)를 받아 내부 비즈니스 로직을 처리한 뒤, 응답객체(HttpServletResponse)에 결과(HTML, JSON 등)를 담아 클라이언트로 보냅니다.
  3. 라이프사이클 관리

    • 서블릿 컨테이너는 서블릿의 로딩, init(), service(), destroy() 호출 시점, 동시성 등도 책임집니다.
  4. 동적 컨텐츠

    • 서블릿은 HTML, JSON, 파일 등을 생성해 응답하거나, 리다이렉트/포워딩할 수도 있습니다.

실전 예시

왜 서블릿 컨테이너가 필요한가?

정리하자면:
서블릿은 서블릿 컨테이너가 관리하는 서버 측 자바 프로그램으로, 웹 요청을 받아 처리한 뒤 응답하는 역할을 하며, 자바 웹 애플리케이션이 동적 서비스를 제공할 수 있게 해줍니다.

references